/**
 * 根据id快速获取dom对象的方法,直接用$方便使用和符合其它框架的习惯
 * @param id 字符串类型
 * @return DOM element
 */
coos.$ = function(id)
{
  return document.getElementById(id);
};

/**
 * 在不确定传入id还是obj类型时快速获取dom对象的方法,用$$方便使用和记忆
 * @param el 元素id或对象
 * @return DOM element
 */
coos.$$ = function(el)
{
  var obj = el;
	if(typeof(el) == "string")
	{
		obj = document.getElementById(el);
	}
	return obj;
};

/**
 * 根据id快速获取dom对象的方法
 * @param id 字符串类型
 * @return DOM element
 */
coos.$id = function(id)
{
  return document.getElementById(id);
};

/**
 * 根据name快速获取dom对象的方法
 * @param name 字符串类型
 * @return DOM elements
 */
coos.$name = function(name)
{
  return document.getElementsByName(name);
};

/**
 * 在不确定传入id还是obj类型时快速获取dom对象的方法
 * @param el 元素id或对象
 * @return DOM element
 */
coos.$obj = function(el)
{
	var obj = el;
	if(typeof(el) == "string")
	{
		obj = document.getElementById(el);
	}
	return obj;
};

/**
 * 获取元素下面所有传入类型的对象.
 * @param tag 标签名称
 * @param el 元素id或对象,为空或不存在则默认为document
 * @example
 获取id为testTag的div下所有li对象为：coos.$tag("li","testTag");
 获取所有li对象为：coos.$tag("li");
 */
coos.$tag = function(tag,el)
{
	var el = coos.$obj(el) || document;
	return el.getElementsByTagName(tag);
};

/**
 * 获取元素的类型名称(如div span)
 */
coos.$tagName = function(el)
{
	return coos.$obj(el).tagName.toLowerCase();
};

/**
 * 获取iframe的contentWindow对象
 */
coos.$F = function(el)
{
	if(!coos.$obj(el) || coos.$tagName(el) != "iframe")
	{
		return null;
	}
	return coos.$obj(el).contentWindow;
};

/**
 * 取得某个范围内的随机数
 */
coos.$random = function(min, max)
{
	return Math.floor(Math.random() * (max - min + 1) + min);
};

/**
 * 获得当前时间
 */
coos.$time = function()
{
	return new Date().getTime();
};

/**
 * 返回document.body
 */
coos.$body = function()
{
	return document.body;
};

/**
 * 获取元素的innerHTML内容
 * @param el 元素id或对象,默认为document.body
 */
coos.$html = function(el)
{
	var obj = coos.$obj(el)|| document.body;
	return 	obj.innerHTML;
};

/**
 * 获取head
 */
coos.$head = function()
{
	return 	document.getElementsByTagName('head')[0];
};

/**
 * 获取元素的文本内容
 * @param el 元素id或对象
 */
coos.$text = function(el)
{
	var obj = coos.$obj(el);
	return 	obj.textContent || obj.innerText;
};

/**
 * 创建元素
 * coos.$create("div")返回一个未绑定到DOM上的div对象
 */
coos.$create = function(tag)
{
	return document.createElement(tag);
};

/**
 * 添加元素
 * @param el 要添加子元素的父元素
 * @param 要添加的子元素
 */
coos.$append = function(el,child)
{
	coos.$obj(el).appendChild(coos.$obj(child));
};

/**
 * 删除元素对应的class
 */
coos.$removeClass = function(className,el)
{
	coos.$obj(el).className = coos.$obj(el).className.replace(new RegExp("( ?|^)" + className + "\\b"), "");
};

/**
 * 判断元素是否有该class
 */
coos.$hasClass = function(className,el)
{
	var oReg = new RegExp("( ?|^)" + className + "\\b");
	return oReg.test(coos.$obj(el).className);
};

/**
 * 判断元素是否有该class
 */
coos.$addClass = function(className,el)
{
	var el = coos.$obj(el);
	if(coos.$hasClass(className,el))
	{
		return;
	}
	else
	{
		el.className = el.className + " " + className;
	}
};

/**
 * 删除元素下对应标签元素所有对应的样式
 */
coos.$removeTagClass = function(className,tag,el)
{
	var els = coos.$tag(tag,el);
	var len = els.length;
	for(var i = 0; i < len; i++)
	{
		coos.$removeClass(className,els[i]);
	}
};

/**
 * 获取元素下对应标签下对应样式的所有元素
 */
coos.$getTagClassElements = function(className,tag,el)
{
	var els = coos.$tag(tag,el);
	var result = [];
	var len = els.length;
	for(var i = 0; i < len; i++)
	{
		if(coos.$hasClass(className,els[i]))
		{
			result[result.length] = els[i];
		}
	}
	return result;
};

/**
 * 隐藏元素，可以传入id或对象
 */
coos.$hide = function(el)
{
	coos.$obj(el).style.display = "none";
};

/**
 * 显示元素，可以传入id或对象
 */
coos.$show = function(el)
{
	coos.$obj(el).style.display = "";
};

/**
 * 此元素下所有对应标签的元素
 */
coos.$hiddenTag = function(tag,el)
{
	var els = coos.$tag(tag,el);
	var len = els.length;
	for(var i = 0; i < len; i++)
	{
		els[i].style.display = "none";
	}
};

/**
 * 获取非position定位的元素top属性值
 */
coos.$top = function(el)
{
	var obj = coos.$obj(el);
	if(coos.browser.msie)
	{
		var top = 0;
	}
	else
	{
		var top = 2;
	}
	while(obj.offsetParent)
	{
		top += obj.offsetTop + (obj.currentStyle?(parseInt(obj.currentStyle.borderTopWidth)).NaN0():0);
		obj = obj.offsetParent;
	}
	top += obj.offsetTop + (obj.currentStyle?(parseInt(obj.currentStyle.borderTopWidth)).NaN0():0);
	
	return top;
};

/**
 * 获取非position定位的元素left属性值
 */
coos.$left = function(el)
{
	var obj = coos.$obj(el);
	if(coos.browser.msie)
	{
		var left = -2;
	}
	else
	{
		var left = 0;
	}
	while(obj.offsetParent)
	{
		left += obj.offsetLeft + (obj.currentStyle?(parseInt(obj.currentStyle.borderLeftWidth)).NaN0():0);
		obj = obj.offsetParent;
	}
	left += obj.offsetLeft + (obj.currentStyle?(parseInt(obj.currentStyle.borderLeftWidth)).NaN0():0);
	
	return left;
};

/**
 * 动态插入脚本并执行
 * @param scriptStr
 * @param el dom元素对象或ID 可以不传入
 * @exsample coos.$script("<script>alert(2);<\/script>");
 */
coos.$script = function(scriptStr,el)
{
	var el = coos.$obj(el);
	if(!el){
		var div = coos.$create("div");
		div.style.display = "none";
		coos.$append(document.body,div);
		el = div;
	}
	if(coos.browser.msie){
		scriptStr = '<div style="display:none">ie</div>' + scriptStr;
		//当节点被移除的时候，ie会重新解析节点内部的html，有脚本则会执行相关的脚本，script要加上defer属性
		scriptStr = scriptStr.replace(/<script([^>]*)>/gi,'<script$1 defer>');
		el.innerHTML = scriptStr;
		el.removeChild(el.firstChild);
	}else{
		var el_next = el.nextSibling;
		var el_parent = el.parentNode;
		el_parent.removeChild(el);
		el.innerHTML = scriptStr;
		if (el_next) {
			el_parent.insertBefore(el, el_next);
		}else {
			el_parent.appendChild(el);
		}
	}
};

/**
 * 插入html代码，解决火狐下不能直接插入html字符串的问题
 * @param where 插入相对el对象的位置：before 插入到之前，top插入到最前面，bottom插入到最后，after插入到之后
 * @param el 插入的相对元素 默认为document.body
 * @param html 插入的html字符串
 * @exsample coos.$insert("top","testDiv","<div>test coos.$insert html</div>");
 */
coos.$insert = function(where, el, html)
{
	var el = coos.$obj(el) || document.body;
	where = where.toLowerCase();   
	if(el.insertAdjacentHTML)
	{
	    switch(where)
	    {   
	        case "before":   
	            el.insertAdjacentHTML('beforeBegin', html);   
	            return el.previousSibling;
	            break;
	        case "top":   
	            el.insertAdjacentHTML('afterBegin', html);   
	            return el.firstChild;
	            break;
	        case "bottom":   
	            el.insertAdjacentHTML('beforeEnd', html);   
	            return el.lastChild;
	            break; 
	        case "after":   
	            el.insertAdjacentHTML('afterEnd', html);   
	            return el.nextSibling;
	            break;
	    }
	    throw 'Illegal insertion point -> "' + where + '"';   
	}
	
	var range = el.ownerDocument.createRange();   
    var frag;
    switch(where)
    {   
         case "before":   
            range.setStartBefore(el);   
            frag = range.createContextualFragment(html);   
            el.parentNode.insertBefore(frag, el);   
            return el.previousSibling;
            break;
         case "top":   
            if(el.firstChild)
            {   
                range.setStartBefore(el.firstChild);   
                frag = range.createContextualFragment(html);   
                el.insertBefore(frag, el.firstChild);   
                return el.firstChild;
            }else
            {   
                el.innerHTML = html;   
                return el.firstChild;   
            }
            break;
        case "bottom":   
            if(el.lastChild)
            {   
                range.setStartAfter(el.lastChild);   
                frag = range.createContextualFragment(html);   
                el.appendChild(frag);   
                return el.lastChild;   
            }
            else
            {   
                el.innerHTML = html;   
                return el.lastChild;   
            }
            break;
        case "after":   
            range.setStartAfter(el);   
            frag = range.createContextualFragment(html);   
            el.parentNode.insertBefore(frag, el.nextSibling);   
            return el.nextSibling; 
            break;  
        }   
        throw 'Illegal insertion point -> "' + where + '"';
};
